package com.atguigu.auth.wwwwww;

import java.util.HashMap;

class ListNode {
    int val; // 表示节点的值
    ListNode next; // 指向下一个节点的指针
    ListNode(int val) {
        this.val = val;
    }
}

public class AddTwoNumbers {
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0); // 创建一个虚拟头节点，用于简化链表的操作
        ListNode p = l1, q = l2, curr = dummy; // p和q分别指向l1和l2的头节点，curr指向结果链表的虚拟头节点
        int carry = 0; // 进位值初始化为0

        // 遍历两个链表
        while (p != null || q != null) {
            int x = (p != null) ? p.val : 0; // 获取当前p节点的值，如果p为空则取0
            int y = (q != null) ? q.val : 0; // 获取当前q节点的值，如果q为空则取0
            int sum = carry + x + y; // 计算当前位的和，包括上一位的进位值

            carry = sum / 10; // 更新进位值，取sum的十位数部分

            curr.next = new ListNode(sum % 10); // 创建新节点，将个位数作为当前位的值

            curr = curr.next; // 将curr指针指向新创建的节点


            if (p != null) p = p.next; // 移动p指针到下一个节点
            if (q != null) q = q.next; // 移动q指针到下一个节点
        }

        // 最后处理可能存在的额外进位
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummy.next; // 返回结果链表的头节点
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);
        AddTwoNumbers solution = new AddTwoNumbers();
        ListNode result = solution.addTwoNumbers(l1, l2);
        HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
    }
}
